HI!大家好,我是 Shammi 😊
在昨天開發的時候,AI 對話機器人已經學會了「查閱」知識庫,能夠從海量資訊中精準地找出最相關的 SDGs 內容。
BUT!還不能用人類的語言來回答問題!
今天的篇幅是把這份「參考資料」傳遞給我們的機器人的大腦—>大型語言模型(LLM),讓它根據這些資訊來生成一個完整且流暢的回覆。
這也是此專案中RAG 架構中最重要的一環:生成(Generation)。
接著開始吧!
傳統的 LLM 容易出現「一本正經地胡說八道」(hallucination)的問題,也就是憑空捏造不存在的資訊。而在 RAG 架構中,LLM 的角色不再是憑空想像,而是:
retrieved_chunks
)。這樣一來,LLM 的回答就有了可靠的依據,大幅降低了胡說八道的風險,也讓我們的 AI 機器人變得更加值得信賴。為此,我們將選擇 Gemini 1.5 Flash 模型。它是一款由 Google 推出的輕量級、高效率模型,特別適合即時問答等需要快速回應的場景。它不僅速度快、成本低,還繼承了超長的上下文視窗,能完美應對我們的 RAG 應用。此外,它也提供了慷慨的免費額度,非常適合我們的開發與學習用途。
接下來,我們將使用 Gemini 1.5 Flash 模型,實現這個生成回覆的功能。Gemini Flash 以其輕量級和快速的特性,非常適合即時問答應用。
因此,在個人專案的應用下,我們選擇 Gemini 1.5 Flash 模型。它是一款由 Google 推出的輕量級、高效率模型,特別適合即時問答等需要快速回應的場景。它不僅速度快、成本低,還繼承了超長的上下文視窗,能完美應對我們的 RAG 應用。此外,它也提供了慷慨的免費額度,非常適合此專案小小的開發與學習用途。
先定義一個函式,讓它接收「問題」和「參考資料」作為輸入,並將它們組合成一個完整的 Prompt(提示詞),然後傳給 Gemini Flash 模型。
import google.generativeai as genai
from google.colab import userdata
GOOGLE_API_KEY = userdata.get('GOOGLE_API_KEY')
genai.configure(api_key=GOOGLE_API_KEY)
model = genai.GenerativeModel('gemini-1.5-flash')
def generate_response(query, retrieved_chunks):
"""
將使用者問題與檢索出的內容組合成 Prompt,並傳給 LLM 進行生成。
"""
# 將檢索出的內容格式化為一個字串
context = "\n---\n".join(retrieved_chunks)
system_prompt = (
"你是一個名為阿米的孩子,個性純真、善良,且充滿愛與同理心。\n"
"你的任務是根據提供的資料,用溫暖、親切、簡潔而深刻的口氣,引導使用者認識 SDGs 的應用。\n"
)
prompt = f"""
{system_prompt}
請根據以下提供的參考資料,簡潔且精準地回答使用者的問題。
如果參考資料中沒有相關資訊,請禮貌地告知使用者,並鼓勵他們提出與 SDGs 相關的問題。
使用者問題:{query}
參考資料:
{context}
"""
response = model.generate_content(prompt)
#傳回模型的回答
return response.text
這段程式碼較著重於[system_prompt],如果讀者們要製作自己的對話機器人,可以運用項目的方式,來訓練對話機器人,項目的方向可設定角色、任務、個性等,提供給讀者們參考。
步驟 2:執行完整的 RAG 流程
再來是檢索功能與生成函式結合,主要可以用來看看確認對話機器人能否正確回答問題。
def get_rag_answer(query):
#step1.將問題向量化
query_vector = get_embedding(query)
#step2.在FAISS索引中搜尋
distances, indices = index.search(query_vector, k=3)
#step3.取得最相關的原始內容
retrieved_chunks = [stored_chunks[i] for i in indices[0]]
#step4.傳給 LLM 產生最終回覆(生成)
final_answer = generate_response(query, retrieved_chunks)
return final_answer
接下來,使用 get_rag_answer
函式來測試不同的問題,它將會動態地去搜尋最相關的答案。
#測試第一個問題
user_query_1 = "永續利用海洋資源有哪些具體目標?" #可以自行更改問題哦。
answer_1 = get_rag_answer(user_query_1)
print(f"使用者問題:{user_query_1}")
print("---")
print("阿米回答:") #我自己將此機器人命名阿米,較有互動感。
print(answer_1)
print("\n")
#測試第二個問題
user_query_2 = "氣候變遷有什麼應對措施?" #可以自行更改問題哦。
answer_2 = get_rag_answer(user_query_2)
print(f"使用者問題:{user_query_2}")
print("---")
print("阿米回答:")
print(answer_2)
參考結果:
經過10天不間斷的發文,如果讀者們有跟著我的腳步操作與理解的話,就完成了 AI 機器人專案的最後一塊拼圖:整合大型語言模型。從現在開始,我們的機器天人不僅能找到資訊,還能用專業且可靠的方式來回答問題。
整個 RAG 架構從 PDF 資料處理到最終生成答案的流程,已經完整串接起來。明天,再來建立基本的對話流程與回覆格式化,讓機器人能「說人話」吧!
有機會再分享為什麼機器人要叫「阿米」吧